/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package br.jcrsistemas.util;

import br.jcrsistemas.database.HibernateUtility;
import br.jcrsistemas.database.TipoBanco;
import br.jcrsistemas.factory.ConnFactory;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.List;
import java.util.Properties;

import org.hibernate.Query;
import javax.persistence.criteria.CriteriaBuilder;
import javax.persistence.criteria.CriteriaQuery;

import org.hibernate.Criteria;
import org.hibernate.Session;
import org.hibernate.criterion.Expression;
import org.hibernate.criterion.Restrictions;

import br.jcrsistemas.seguranca.Criptografia;
import br.jcrsistemas.syscomercio.bean.Configuracao;

/**
 *
 * @author Carlos Ribeiro
 */
public final class Configuracoes {

    private static File arquivo;
    private static Properties propriedades;
    private static FileInputStream fis;
    private static Configuracao totalComandas = null;

    public static final String pegarValor(String chave) {
        if (arquivo == null) {
            arquivo = new File("configuracoes.properties");
        }
        if (fis == null) {
            try {
                fis = new FileInputStream(arquivo);
            } catch (Exception e) {
                System.out.println(e);
            }

        }
        if (propriedades == null) {
            try {
                propriedades = new Properties();
                propriedades.load(fis);
            } catch (Exception e) {
                System.out.println(e);
            }

        }
        return propriedades.getProperty(chave);

    }

    public static final boolean salvarValor(String chave, String valor) {
        propriedades.setProperty(chave, valor);
        //o arquivo encontra-se no mesmo dire�rio da aplica��o
        FileOutputStream fos = null;
        try {
            fos = new FileOutputStream(arquivo);
            //grava os dados  no arquivo
            propriedades.store(fos, "Configurações do arquivo");
            fos.close();
            return true;
        } catch (IOException ex) {
            System.out.println(ex.getMessage());
            ex.printStackTrace();
            return false;
        }

    }

    public static boolean isDebugOn() {
        return Boolean.parseBoolean(pegarValor("debug"));
    }

    public static String getLocalPath() {
        try {
            return (new File(".").getCanonicalPath());
        } catch (IOException e) {
            return null;
        }
    }

    public static TipoBanco getTipoBanco() {
        if ((pegarValor("database").equalsIgnoreCase("POSTGRESQL")) || (pegarValor("database").equalsIgnoreCase("POSTGRES")) || (pegarValor("database").equalsIgnoreCase("POSTGRE"))) {
            return TipoBanco.POSTGRESQL;
        }
        if (pegarValor("database").equalsIgnoreCase("MYSQL5")) {
            return TipoBanco.MYSQL5;
        }
        if (pegarValor("database").equalsIgnoreCase("MYSQL")) {
            return TipoBanco.MYSQL;
        }        
        return null;

    }

    public static String getUsuarioBanco() {
        return pegarValor("usuario");
    }

    public static String getSenhaBanco() {
        return Criptografia.decript(pegarValor("senha"));
    }

    public static String getHost() {
        return pegarValor("host");
    }

    public static String getPorta() {
        return pegarValor("porta");
    }

    public static String getDbName() {
        return pegarValor("banco");
    }

    public static boolean isSubstanceTheme() {
        return pegarValor("tema_substance").equalsIgnoreCase("true") ? true : false;
    }

    public static int getMaxConnection() {
        return pegarValor("max_conexoes") == null ? 10 : Integer.parseInt(pegarValor("max_conexoes"));
    }
    
    public static int getTotalComandas() {
//    	return pegarValor("comandas") == null ? 0 : Integer.parseInt(pegarValor("comandas"));
    	if(totalComandas == null ) {
			Session sessao = new HibernateUtility().getSessao();
			Criteria criteria = sessao.createCriteria(Configuracao.class);
			criteria.add(Restrictions.eq("chave", "total_comandas"));
			
			List resultados = criteria.list();
			if(resultados.size() != 0 ) {
				totalComandas = (Configuracao) resultados.get(0);
			}
			
		}
		return Integer.parseInt(totalComandas.getValor());
    }

    public static int getWidth() {
        return Integer.parseInt(pegarValor("width"));
    }

    public static int getHeight() {
        return Integer.parseInt(pegarValor("height"));
    }
}
